package com.youlai.boot.factory.service;

import com.youlai.boot.factory.model.entity.WorkReport;
import com.youlai.boot.factory.model.form.WorkReportForm;
import com.youlai.boot.factory.model.query.WorkReportQuery;
import com.youlai.boot.factory.model.vo.EmployeePaymentStatusVO;
import com.youlai.boot.factory.model.vo.EmployeeSalaryVO;
import com.youlai.boot.factory.model.vo.MonthlySalaryVO;
import com.youlai.boot.factory.model.vo.WorkReportDetailVO;
import com.youlai.boot.factory.model.vo.WorkReportVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 报工单服务类
 *
 * @author youlaitech
 * @since 2025-10-13 13:30
 */
public interface WorkReportService extends IService<WorkReport> {

    /**
     *报工单分页列表
     *
     * @return {@link IPage<WorkReportVO>} 报工单分页列表
     */
    IPage<WorkReportVO> getWorkReportPage(WorkReportQuery queryParams);


    /**
     * 查询我的报工单分页列表
     *
     * @return {@link IPage<WorkReportVO>} 报工单分页列表
     */
    IPage<WorkReportVO> getMyWorkReportPage(WorkReportQuery queryParams);


    /**
     * 获取报工单表单数据
     *
     * @param id 报工单ID
     * @return 报工单表单数据
     */
     WorkReportForm getWorkReportFormData(Long id);

    /**
     * 获取报工单详情数据
     *
     * @param id 报工单ID
     * @return 报工单表单数据
     */
    WorkReportDetailVO getWorkReportDetail(Long id);



    /**
     * 新增报工单
     *
     * @param formData 报工单表单对象
     * @return 是否新增成功
     */
    boolean saveWorkReport(WorkReportForm formData);

    /**
     * 报工提交
     *
     * @param formData 报工单表单对象
     * @return 是否新增成功
     */
    boolean submitWorkReport(WorkReportForm formData);


    /**
     * 修改报工单
     *
     * @param id   报工单ID
     * @param formData 报工单表单对象
     * @return 是否修改成功
     */
    boolean updateWorkReport(Long id, WorkReportForm formData);

    /**
     * 删除报工单
     *
     * @param ids 报工单ID，多个以英文逗号(,)分割
     * @return 是否删除成功
     */
    boolean deleteWorkReports(String ids);

    /**
     * 审核通过报工单
     *
     * @param id 报工单ID
     * @return 是否审核成功
     */
    boolean approveWorkReport(Long id);

    /**
     * 批量审核通过报工单
     *
     * @param ids 报工单ID列表
     * @return 是否审核成功
     */
    boolean batchApproveWorkReports(java.util.List<Long> ids);

    /**
     * 驳回报工单
     *
     * @param id 报工单ID
     * @param rejectReason 驳回原因
     * @return 是否驳回成功
     */
    boolean rejectWorkReport(Long id, String rejectReason);

    /**
     * 批量驳回报工单
     *
     * @param ids 报工单ID列表
     * @param rejectReason 驳回原因
     * @return 是否驳回成功
     */
    boolean batchRejectWorkReports(java.util.List<Long> ids, String rejectReason);

    /**
     * 单个报工单结算
     *
     * @param id 报工单ID
     * @return 是否结算成功
     */
    boolean settleWorkReport(Long id);

    /**
     * 批量结算报工单
     *
     * @param ids 报工单ID列表
     * @return 是否结算成功
     */
    boolean batchSettleWorkReports(java.util.List<Long> ids);

    /**
     * 获取当前用户指定月份的工资信息
     *
     * @param month 月份（格式：yyyy-MM）
     * @return 月度工资信息
     */
    MonthlySalaryVO getMonthlySalary(String month);

    /**
     * 获取所有员工指定月份的工资统计列表（老板核对工资用）
     *
     * @param month 月份（格式：yyyy-MM）
     * @return 员工工资统计列表
     */
    List<EmployeeSalaryVO> getEmployeeSalaryList(String month);

    /**
     * 获取指定员工某月已审核通过的报工单分页列表
     *
     * @param queryParams 查询参数（需包含workerId和settlementMonth）
     * @return 报工单分页列表
     */
    IPage<WorkReportVO> getEmployeeMonthWorkReportPage(WorkReportQuery queryParams);

    /**
     * 获取所有员工的工资发放状态列表
     *
     * @param month 月份（格式：yyyy-MM）
     * @return 员工工资发放状态列表
     */
    List<EmployeePaymentStatusVO> getEmployeePaymentStatusList(String month);

}
